home *** CD-ROM | disk | FTP | other *** search
/ Internet Tools (InfoMagic) / Internet Tools.iso / applic / ncsa / tn3270 / scrio.assemble.Z / scrio.assemble
Text File  |  1989-11-19  |  15KB  |  189 lines

  1. SCRIO    TITLE 'Execute CCW for a 3270 Display'                         00001000
  2. SCRIO    CSECT                                                          00002000
  3.          SPACE                                                          00003000
  4. *---------------------------------------------------------------------* 00004000
  5. *                                                                     * 00005000
  6. *   SCRIO executes a CCW for a 3270 display. At entry, R1 -> CCW and  * 00006000
  7. *   R2 contains the device address.  The high-order byte of R2        * 00007000
  8. *   contains the flag bits defined for FLAGS.  R15 contains the       * 00008000
  9. *   entry address and R13 points to a standard save area.             * 00009000
  10. *   When SCRIO returns, the condition code and R15 are set to in-     * 00010000
  11. *   dicate success or failure.  A sense byte or 0 is returned in      * 00011000
  12. *   the high-order byte of R0. The residual count or 0 is returned    * 00012000
  13. *   in the remainder of R0.                                           * 00013000
  14. *                                                                     * 00014000
  15. *   SCRIO disables interrupts and runs with the system key.           * 00015000
  16. *   SCRIO is re-entrant.  DMSFREE, DMSFRET, and DMSKEY are called     * 00016000
  17. *   via SVC 203.  For a CMS console, CONWAIT is called via SVC 202.   * 00017000
  18. *                                                                     * 00018000
  19. *---------------------------------------------------------------------* 00019000
  20.          SPACE                                                          00020000
  21.          PRINT NOGEN                                                    00021000
  22.          STM   R14,R12,12(R13)     SAVE REGISTERS                       00022000
  23.          LR    R12,R15             SET-UP ADDRESSING                    00023000
  24.          USING SCRIO,R12                                                00024000
  25.          USING NUCON,0                                                  00025000
  26.          LR    R3,R1               SAVE CCW ADDRESS IN R3               00026000
  27.          LA    R0,WORKDBLW         GET WORK AREA DOUBLEWORD COUNT       00027000
  28.          DMSFREE DWORDS=(0),TYPE=USER,ERR=STGERR,MSG=NO                 00028000
  29.          B     GOTFREE                                                  00029000
  30.          SPACE                                                          00030000
  31. STGERR   LA    R15,104             ERROR CODE 104 FOR NO STORAGE        00031000
  32.          SR    R0,R0               NO SENSE OR RESIDUAL COUNT           00032000
  33.          L     R14,12(R13)         RESTORE OTHER REGISTERS              00033000
  34.          LM    R1,R12,24(R13)                                           00034000
  35.          LTR   R15,R15             SET CC FROM R15                      00035000
  36.          BR    R14                 RETURN                               00036000
  37.          SPACE                                                          00037000
  38. GOTFREE  LR    R9,R1               SET-UP WORK AREA                     00038000
  39.          USING WORKAREA,R9         R9 RESERVED FOR THIS                 00039000
  40.          STM   R0,R1,WORKFRET      SAVE INFO FOR FRET                   00040000
  41.          LA    R1,SAVEAREA         CHAIN SAVE AREAS                     00041000
  42.          ST    R13,SAVEAREA+4                                           00042000
  43.          ST    R1,8(R13)                                                00043000
  44.          LA    R13,SAVEAREA        NOW READY FOR SUBROUTINE CALLS       00044000
  45.          MVI   SBYTE,0             SENSE BYTE IS 0                      00045000
  46.          XC    RESCOUNT(4),RESCOUNT  RESIDUAL COUNT IS 0                00046000
  47.          XC    RTNCODE(4),RTNCODE  RETURN CODE IS 0                     00047000
  48.          ST    R3,CCWADDR          SAVE CCW ADDRESS                     00048000
  49.          STCM  R2,B'1000',FLAGS    SAVE FLAGS                           00049000
  50.          STH   R2,DEVADDR          SAVE DEVICE ADDRESS                  00050000
  51.          DMSKEY NUCLEUS            GET SYSTEM KEY                       00051000
  52.          SSM   =X'00'              DISABLE INTERRUPTS                   00052000
  53.          TM    FLAGS,CMSCON        IF CMS CONSOLE, FINISH I/O           00053000
  54.          BZ    SCRADDR                                                  00054000
  55.          LH    R2,NUMPNDWR         ANY PENDING WRITES?                  00055000
  56.          LTR   R2,R2               IF NOT, SKIP CALLING CONWAIT         00056000
  57.          BZ    SCRADDR                                                  00057000
  58.          SSM   =X'FF'              ENABLE INTERRUPTS                    00058000
  59.          LA    R1,=CL8'CONWAIT'    CLEAR PENDING CMS CONSOLE I/O        00059000
  60.          SVC   202                                                      00060000
  61.          DC    AL4(1)              IGNORE ERRORS                        00061000
  62.          SSM   =X'00'              SET NO INTERRUPTION                  00062000
  63. SCRADDR  LH    R2,DEVADDR          DISPLAY ADDRESS CUU                  00063000
  64.          L     R1,CCWADDR          R1 -> CCW                            00064000
  65. WAITDISP EQU   *                                                        00065000
  66.          TIO   0(R2)               RESET ALL PENDING INTERRUPTIONS      00066000
  67.          BC    6,WAITDISP          AND LOOP IF SOME MORE                00067000
  68.          BC    1,RESETSCR          ERROR IF DISPLAY NOT OPERATIONAL     00068000
  69. *                                                                       00069000
  70. * ISSUE DIAGNOSE                                                        00070000
  71. *                                                                       00071000
  72. DIAG     EQU   *                                                        00072000
  73.          DIAG  R1,R2,X'58'         ISSUE DIAGNOSE                       00073000
  74.          BC    8,TIO1              ALL OK: GO WAIT FOR END OF I/O       00074000
  75.          BC    2,DIAG              BUSY: REISSUE DIAGNOSE               00075000
  76.          BC    4,CHKCSW            GO LOOK AT CSW                       00076000
  77.          BC    1,RESETSCR          ERROR IF DISPLAY NOT OPERATIONAL     00077000
  78. *                                                                       00078000
  79. * WAIT FOR THE END OF THE INPUT/OUTPUT AND CHECK CSW                    00079000
  80. *                                                                       00080000
  81. TIO1     EQU   *                                                        00081000
  82.          TIO   0(R2)               WAIT FOR THE END OF INPUT/OUTPUT     00082000
  83.          BC    8,CHKCSW            OK: GO ON                            00083000
  84.          BC    2,TIO1              BUSY: KEEP LOOPING                   00084000
  85.          BC    1,RESETSCR          ERROR IF DISPLAY NOT OPERATIONAL     00085000
  86.          TM    CSW+4,X'B0'         CSW STORED + ATTN CTLUNIT END BUSY   00086000
  87.          BNZ   TIO1                YES THEN HANDLE AS BUSY              00087000
  88. CHKCSW   EQU   *                                                        00088000
  89.          CLI   CSW+5,X'00'         SOME PROBLEM WITH THE CHANNEL ?      00089000
  90.          BNE   RESETSCR            YES NOTHING WE CAN DO                00090000
  91.          LH    R0,CSW+6            GET RESIDUAL COUNT                   00091000
  92.          ST    R0,RESCOUNT         SAVE TO RETURN                       00092000
  93.          CLI   CSW+4,X'0C'         DID WE GET CE+DE ?                   00093000
  94.          BE    GOTCEDE             YES- WE ARE FINISHED                 00094000
  95.          CLI   CSW+4,X'08'         DID WE GET CE ONLY ?                 00095000
  96.          BE    TIO2                YES GO WAIT FOR DE                   00096000
  97.          TM    FLAGS,CMSCON        IS THIS THE CMS CONSOLE?             00097000
  98.          BZ    NOTCP               NO, SKIP CHECK FOR CP ERROR          00098000
  99.          CLI   CSW+4,X'8E'         IS THIS ERROR CODE '8E' FROM CP ?    00099000
  100.          BE    CPERR               YES, INDICATE IT TO CALLER           00100000
  101. NOTCP    TM    CSW+4,X'02'         UNIT CHECK ?                         00101000
  102.          BO    SENSE               YES GO DO A SENSE                    00102000
  103.          TM    CSW+4,X'B0'         ATTN OR CTL UNIT END OR BUSY ?       00103000
  104.          BNZ   DIAG                IF YES REISSUE THE DIAGNOSE          00104000
  105.          TM    CSW+4,X'0C'         DID WE GET AT LEAST CE OR DE ?       00105000
  106.          BZ    DIAG                NO REISSUE THE DIAGNOSE              00106000
  107. TIO2     EQU   *                                                        00107000
  108.          TIO   0(R2)               WAIT FOR DE                          00108000
  109.          BC    2,TIO2              BUSY KEEP LOOPING                    00109000
  110.          BC    1,RESETSCR          ERROR IF DISPLAY NOT OPERATIONAL     00110000
  111. *                                                                       00111000
  112. * ALL OK EXIT                                                           00112000
  113. *                                                                       00113000
  114. GOTCEDE  EQU   *                                                        00114000
  115.          B     SCRRTN              KEEP RETURN CODE 0                   00115000
  116.          SPACE                                                          00116000
  117. *                                                                       00117000
  118. * ERRORS                                                                00118000
  119. *                                                                       00119000
  120. CPERR    EQU   *                   ERROR X'8E' FROM CP                  00120000
  121.          MVI   RTNCODE+3,X'8E'     RETURN ERROR TO CALLER               00121000
  122.          B     SCRRTN                                                   00122000
  123.          SPACE                                                          00123000
  124. SCRERR   EQU   *                                                        00124000
  125.          MVI   RTNCODE+3,4         STANDARD ERROR RC                    00125000
  126.          MVC   RTNCODE+1(2),X'40'  ALSO STATUS BYTES FROM CSW           00126000
  127.          B     SCRRTN                                                   00127000
  128.          SPACE                                                          00128000
  129. SENSE    EQU   *                   GET SENSE DATA CP HAS FOR US         00129000
  130.          TM    FLAGS,NOSENSE       SENSE SUPPRESSED?                    00130000
  131.          BO    SCRERR              YES, THEN JUST RETURN ERROR          00131000
  132. *                                  BUILD CCW, CALL OURSELVES            00132000
  133.          LA    R1,SBYTE            STORE BUFFER ADDRESS IN CCW          00133000
  134.          ST    R1,SENSECCW                                              00134000
  135.          MVI   SENSECCW,X'04'      SENSE COMMAND                        00135000
  136.          MVC   SENSECCW+4(4),=F'1' COUNT = 1                            00136000
  137.          MVI   SENSECCW+4,X'20'    SILI                                 00137000
  138.          LA    R1,SENSECCW         R1 -> SENSE CCW                      00138000
  139.          LH    R2,DEVADDR          R2 = DEVICE ADDRESS                  00139000
  140.          ICM   R2,B'1000',=AL1(NOSENSE)  AVOID LOOPING                  00140000
  141.          LA    R15,SCRIO           MAKE RECURSIVE CALL                  00141000
  142.          BALR  R14,R15             READ SENSE BYTE                      00142000
  143. *                                  (IGNORE ERRORS)                      00143000
  144. RESETSCR TM    FLAGS,CMSCON        CMS CONSOLE?                         00144000
  145.          BZ    RESETERR            NO, JUST RETURN ERROR                00145000
  146.          LH    R2,DEVADDR          GET DISPLAY ADDRESS CUU              00146000
  147.          DIAG  R2,R3,X'24'         IS IT STILL THERE                    00147000
  148.          BC    2,GOTCEDE           EXIT IF DISCONNECTED                 00148000
  149. RESETERR MVI   RTNCODE+3,8         SENSE BYTE ERROR CODE                00149000
  150.          MVC   RTNCODE+1(2),X'40'  ALSO STATUS BYTES FROM CSW           00150000
  151.          SPACE                                                          00151000
  152. SCRRTN   EQU   *                   GET DATA FROM WORKAREA TO RETURN     00152000
  153.          DMSKEY RESET              RESTORE CALLER'S KEY                 00153000
  154.          L     R2,RTNCODE          RETURN CODE IN R2                    00154000
  155.          L     R3,RESCOUNT         RESIDUAL COUNT IN R3                 00155000
  156.          ICM   R3,B'1000',SBYTE      PLUS SENSE BYTE                    00156000
  157.          L     R13,4(R13)          RESTORE R13 FROM SAVE AREA           00157000
  158.          LM    R0,R1,WORKFRET      RETURN WORK AREA STORAGE             00158000
  159.          DMSFRET DWORDS=(0),LOC=(1)                                     00159000
  160.          DROP  R9                  DON'T USE WORK AREA NOW!             00160000
  161.          L     R14,12(R13)         RESTORE RETURN ADDRESS               00161000
  162.          LR    R15,R2              RETURN ADDRESS INTO R15              00162000
  163.          LR    R0,R3               SENSE AND RESIDUAL COUNT INTO R0     00163000
  164.          LM    R1,R12,24(R13)      RESTORE OTHER REGISTERS              00164000
  165.          LTR   R15,R15             SET CONDITION CODE FOR CALLER        00165000
  166.          BR    R14                 RETURN TO CALLER                     00166000
  167.          SPACE                                                          00167000
  168.          LTORG                                                          00168000
  169.          EJECT                                                          00169000
  170. * WORK AREA IN FREE STORAGE                                             00170000
  171.          SPACE                                                          00171000
  172. WORKAREA DSECT                                                          00172000
  173. WORKFRET DS    1D                  R0, R1 TO FREE WORK AREA             00173000
  174. SAVEAREA DS    12D                 SAVE AREA FOR CALLED ROUTINES        00174000
  175. SENSECCW DS    1D                  SENSE CCW BUILT HERE                 00175000
  176. RTNCODE  DS    1F                  RETURN CODE                          00176000
  177. RESCOUNT DS    1F                  RESIDUAL COUNT                       00177000
  178. DEVADDR  DS    1H                  DEVICE ADDRESS                       00178000
  179. CCWADDR  DS    1A                  CCW ADDRESS                          00179000
  180. SBYTE    DS    1X                  SENSE BYTE                           00180000
  181. FLAGS    DS    1X                  FLAGS FROM CALLER                    00181000
  182. CMSCON   EQU   X'01'                 I/O IS TO CMS CONSOLE              00182000
  183. NOSENSE  EQU   X'02'                 DON'T DO SENSE IF ERROR            00183000
  184. WORKSIZE EQU   *-WORKAREA          SIZE IN BYTES                        00184000
  185. WORKDBLW EQU   (WORKSIZE+7)/8      SIZE IN DOUBLEWORDS                  00185000
  186.          NUCON                                                          00186000
  187.          REGEQU                                                         00187000
  188.          END                                                            00188000
  189.